package com.yang.design.behavior.observe.example2;

/**
 * 开奖服务接口
 */
public abstract class LotteryService {

    //注入 事件处理类
    private EventManager eventManager;

    //构造方法初始化EventManager,完成订阅操作
    public LotteryService() {
        //设置事件类型，目前只有MQ，MESSAGE两种类型
        eventManager = new EventManager(EventManager.EventType.MQ, EventManager.EventType.MESSAGE);
        //订阅，MQ和MESSAGE目前只有只有一种，而EventManager中用list是为了方便后期扩展
        eventManager.subscribe(EventManager.EventType.MESSAGE,new MessageEventListener());
        eventManager.subscribe(EventManager.EventType.MQ,new MQEventListener());
    }

    /**
     * 开奖服务的业务处理方法，并发送通知
     * @param uId
     * @return
     */
    public LotteryResult lotteryAndMsg(String uId){
        //调用子类方法
        LotteryResult result = lottery(uId);
        //发送通知，通知事件监听者（即观察者）
        eventManager.notify(EventManager.EventType.MQ,result);
        eventManager.notify(EventManager.EventType.MESSAGE,result);

        //返回
        return result;
    }

    /**
     * 抽象的开奖方法，具体开奖的业务由子类决定
     * @param uId
     * @return
     */
    public abstract LotteryResult lottery(String uId);
}
